// 定义经纬度类型
export type LngLat = [number, number];

/**
 * AMap插件名称类型
 * 可选值: "Scale" | "ToolBar" | "HawkEye" | "ControlBar"
 */
export type PluginName = "Scale" | "ToolBar" | "HawkEye" | "ControlBar";

/**
 * 地图基础配置选项接口
 * 定义初始化地图实例时所需的基础配置参数，用于控制地图的显示效果和交互行为
 * @interface MapBaseOptions
 * @property {number} zoom - 地图缩放级别，取值范围通常为3-18（不同地图服务商可能有差异）
 * @property {LngLat} center - 地图中心点坐标，使用经纬度数组表示 [经度, 纬度]
 * @property {'2D' | '3D'} [viewMode] - 地图视图模式，可选值为'2D'或'3D'，默认为'2D'
 * @property {[number, number]} [zooms] - 地图缩放级别范围，数组的两个元素分别表示最小和最大缩放级别
 * @property {any} [key: string] - 其他可选配置参数，支持地图API提供的任何额外配置项
 */
export interface MapBaseOptions {
  zoom: number;
  center: [number, number];
  viewMode?: "2D" | "3D";
  zooms?: [number, number];
  [key: string]: any;
}

/**
 * 地图模块事件处理接口
 * 定义地图模块中事件的结构，用于绑定和管理地图交互事件
 * @interface AmapModuleEvent
 * @property {string} name - 事件名称，对应地图API支持的事件类型（如'click'、'mouseover'等）
 * @property {(e: any, name: string) => void} cb - 事件回调函数
 * @param {any} e - 事件对象，包含事件相关信息（坐标、触发元素等）
 * @param {string} name - 事件名称，同AmapModuleEvent.name
 */
export interface AmapModuleEvent {
  name: string;
  cb: (e: any, name: string) => void;
}

/**
 * 地图模块配置接口
 * 定义地图功能模块的基础配置结构，用于初始化和管理地图上的各种功能模块
 * @interface AmapModulesOptions
 * @property {string} name - 模块名称，用于标识和管理不同类型的地图模块（如'Marker'、'Polyline'等）
 * @property {any} [markers] - 模块相关数据，如标记点、折线等，模块所需的具体数据配置
 * @property {any} [extra] - 额外配置参数，用于扩展模块功能的自定义选项（可选）
 * @property {AmapModuleEvent[]} [events] - 事件处理数组，包含模块需要绑定的事件列表（可选）
 */
export interface AmapModulesOptions {
  name: string;
  markers: any;
  extra?: any;
  events?: AmapModuleEvent[];
}

/**
 * 模块加载状态接口
 */
export interface ModuleLoadState {
  promise: Promise<any> | null;
  instance: any | null;
  loading: boolean;
}

/**
 * Geocoder模块接口 - 定义模块对外暴露的结构
 */
export interface ModuleInstance {
  /** 模块名称 */
  name: string;
  /** 模块实例 */
  instance: any;
  /** 事件处理对象 */
  events: any;
}

/**
 * 模块加载完成接口
 * 表示一个已加载的地图模块的完整信息，包含模块名称、实例、工厂和配置
 */
export interface LoadedModule {
  /**
   * 模块名称
   * 用于标识加载的模块类型，如 'Geocoder', 'Marker', 'InfoWindow' 等
   */
  name: string;

  /**
   * 模块实例
   * 模块初始化后的实例对象，包含模块的具体功能和方法
   * 可能为 null，表示模块初始化失败
   */
  moduleInstance: ModuleInstance | null;

  /**
   * 模块工厂
   * 用于创建模块实例的工厂对象，包含初始化模块的方法
   */
  moduleFactory: any;

  /**
   * 模块配置
   * 加载模块时传入的配置参数，包含标记点数据、额外选项等
   */
  moduleConfig: AmapModulesOptions;
}
